{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n",
      "C:\\Users\\tghosh\\AppData\\Local\\Continuum\\Anaconda3\\lib\\site-packages\\gensim\\utils.py:862: UserWarning: detected Windows; aliasing chunkize to chunkize_serial\n",
      "  warnings.warn(\"detected Windows; aliasing chunkize to chunkize_serial\")\n"
     ]
    }
   ],
   "source": [
    "import config\n",
    "from dataloader.loader import Loader\n",
    "import pandas as pd\n",
    "from gensim.models import word2vec\n",
    "import nltk\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "#unsupervised = Loader.load_imdb_unsup()\n",
    "unsupervised = pd.read_csv(config.IMDB_DATA_CSV + '/movie_reviews_unsup.csv', encoding='ISO-8859-1')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Unnamed: 0</th>\n",
       "      <th>review</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>41353</td>\n",
       "      <td>If you listen closely, you can catch sublimina...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>21919</td>\n",
       "      <td>Tweety is perched in his cage on the ledge and...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>46492</td>\n",
       "      <td>I love action movies. Die Hard, Lethal Wepon, ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2478</td>\n",
       "      <td>I know that title isn't very descriptive, but ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>37290</td>\n",
       "      <td>Sadly, this film is a laugh-less failure (minu...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Unnamed: 0                                             review\n",
       "0       41353  If you listen closely, you can catch sublimina...\n",
       "1       21919  Tweety is perched in his cage on the ledge and...\n",
       "2       46492  I love action movies. Die Hard, Lethal Wepon, ...\n",
       "3        2478  I know that title isn't very descriptive, but ...\n",
       "4       37290  Sadly, this film is a laugh-less failure (minu..."
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "unsupervised.head()\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "train_df = pd.read_csv(config.IMDB_DATA_CSV + '/movie_reviews_train.csv', encoding='ISO-8859-1')\n",
    "test_df = pd.read_csv(config.IMDB_DATA_CSV + '/movie_reviews_test.csv', encoding='ISO-8859-1')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "corpus = unsupervised['review'].tolist() + train_df['review'].tolist() + test_df['review'].tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# tokenize sentences in corpus\n",
    "wpt = nltk.WordPunctTokenizer()\n",
    "tokenized_corpus = [wpt.tokenize(document.lower()) for document in corpus]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Set values for various parameters\n",
    "feature_size = 50    # Word vector dimensionality  \n",
    "window_context = 10          # Context window size                                                                                    \n",
    "min_word_count = 5   # Minimum word count                        \n",
    "sample = 1e-3   # Downsample setting for frequent words"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "w2v_model = word2vec.Word2Vec(tokenized_corpus, size=feature_size, \n",
    "                          window=window_context, min_count=min_word_count,\n",
    "                          sample=sample, iter=1000)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "similar_words = {search_term: [item[0] for item in w2v_model.wv.most_similar([search_term], topn=5)]\n",
    "                  for search_term in ['good','superior','violent', 'romantic', 'nasty', 'unfortunate', \n",
    "                                      'predictable', 'hilarious', 'fascinating', 'boring','confused', 'sensitive',\n",
    "                                     'imaginative','senseless', 'bland','disappointing']}\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'bland': ['dull', 'lifeless', 'forgettable', 'uninspired', 'unconvincing'],\n",
       " 'boring': ['dull', 'pointless', 'tedious', 'predictable', 'uninteresting'],\n",
       " 'confused': ['irritated', 'puzzled', 'disturbed', 'frustrated', 'annoyed'],\n",
       " 'disappointing': ['unsatisfying',\n",
       "  'disappointed',\n",
       "  'enjoyable',\n",
       "  'surprising',\n",
       "  'satisfying'],\n",
       " 'fascinating': ['compelling',\n",
       "  'enthralling',\n",
       "  'captivating',\n",
       "  'unique',\n",
       "  'vivid'],\n",
       " 'good': ['decent', 'great', 'nice', 'bad', 'fine'],\n",
       " 'hilarious': ['funny', 'hysterical', 'priceless', 'comical', 'humorous'],\n",
       " 'imaginative': ['inventive',\n",
       "  'innovative',\n",
       "  'ingenious',\n",
       "  'intricate',\n",
       "  'creative'],\n",
       " 'nasty': ['sadistic', 'sleazy', 'gory', 'icky', 'vicious'],\n",
       " 'predictable': ['clichéd', 'formulaic', 'contrived', 'implausible', 'dull'],\n",
       " 'romantic': ['romance',\n",
       "  'screwball',\n",
       "  'bittersweet',\n",
       "  'sentimental',\n",
       "  'delightful'],\n",
       " 'senseless': ['pointless',\n",
       "  'meaningless',\n",
       "  'disgusting',\n",
       "  'sickening',\n",
       "  'boring'],\n",
       " 'sensitive': ['sincere', 'passionate', 'mature', 'delicate', 'confident'],\n",
       " 'superior': ['inferior', 'weaker', 'truer', 'classier', 'maligned'],\n",
       " 'unfortunate': ['unacceptable',\n",
       "  'disastrous',\n",
       "  'dubious',\n",
       "  'inadequate',\n",
       "  'important'],\n",
       " 'violent': ['brutal', 'graphic', 'gruesome', 'sadistic', 'violence']}"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "similar_words"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "#w2v_model.wv.save_word2vec_format(fname = 'imdb_word2vec.txt')\n",
    "file = 'C:/Users/tghosh/Work/Data Science/Transfer Learning/Chapter-7/Data/word2vec/imdb_word2vec.txt'\n",
    "from gensim.models import KeyedVectors\n",
    "word_vectors = KeyedVectors.load_word2vec_format(file, binary=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>bland</th>\n",
       "      <td>dull</td>\n",
       "      <td>lifeless</td>\n",
       "      <td>forgettable</td>\n",
       "      <td>uninspired</td>\n",
       "      <td>unconvincing</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>boring</th>\n",
       "      <td>dull</td>\n",
       "      <td>pointless</td>\n",
       "      <td>tedious</td>\n",
       "      <td>predictable</td>\n",
       "      <td>uninteresting</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>confused</th>\n",
       "      <td>irritated</td>\n",
       "      <td>puzzled</td>\n",
       "      <td>disturbed</td>\n",
       "      <td>frustrated</td>\n",
       "      <td>annoyed</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>disappointing</th>\n",
       "      <td>unsatisfying</td>\n",
       "      <td>disappointed</td>\n",
       "      <td>enjoyable</td>\n",
       "      <td>surprising</td>\n",
       "      <td>satisfying</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>fascinating</th>\n",
       "      <td>compelling</td>\n",
       "      <td>enthralling</td>\n",
       "      <td>captivating</td>\n",
       "      <td>unique</td>\n",
       "      <td>vivid</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>good</th>\n",
       "      <td>decent</td>\n",
       "      <td>great</td>\n",
       "      <td>nice</td>\n",
       "      <td>bad</td>\n",
       "      <td>fine</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>hilarious</th>\n",
       "      <td>funny</td>\n",
       "      <td>hysterical</td>\n",
       "      <td>priceless</td>\n",
       "      <td>comical</td>\n",
       "      <td>humorous</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>imaginative</th>\n",
       "      <td>inventive</td>\n",
       "      <td>innovative</td>\n",
       "      <td>ingenious</td>\n",
       "      <td>intricate</td>\n",
       "      <td>creative</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nasty</th>\n",
       "      <td>sadistic</td>\n",
       "      <td>sleazy</td>\n",
       "      <td>gory</td>\n",
       "      <td>icky</td>\n",
       "      <td>vicious</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>predictable</th>\n",
       "      <td>clichéd</td>\n",
       "      <td>formulaic</td>\n",
       "      <td>contrived</td>\n",
       "      <td>implausible</td>\n",
       "      <td>dull</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>romantic</th>\n",
       "      <td>romance</td>\n",
       "      <td>screwball</td>\n",
       "      <td>bittersweet</td>\n",
       "      <td>sentimental</td>\n",
       "      <td>delightful</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>senseless</th>\n",
       "      <td>pointless</td>\n",
       "      <td>meaningless</td>\n",
       "      <td>disgusting</td>\n",
       "      <td>sickening</td>\n",
       "      <td>boring</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sensitive</th>\n",
       "      <td>sincere</td>\n",
       "      <td>passionate</td>\n",
       "      <td>mature</td>\n",
       "      <td>delicate</td>\n",
       "      <td>confident</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>superior</th>\n",
       "      <td>inferior</td>\n",
       "      <td>weaker</td>\n",
       "      <td>truer</td>\n",
       "      <td>classier</td>\n",
       "      <td>maligned</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>unfortunate</th>\n",
       "      <td>unacceptable</td>\n",
       "      <td>disastrous</td>\n",
       "      <td>dubious</td>\n",
       "      <td>inadequate</td>\n",
       "      <td>important</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>violent</th>\n",
       "      <td>brutal</td>\n",
       "      <td>graphic</td>\n",
       "      <td>gruesome</td>\n",
       "      <td>sadistic</td>\n",
       "      <td>violence</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                          0             1            2            3  \\\n",
       "bland                  dull      lifeless  forgettable   uninspired   \n",
       "boring                 dull     pointless      tedious  predictable   \n",
       "confused          irritated       puzzled    disturbed   frustrated   \n",
       "disappointing  unsatisfying  disappointed    enjoyable   surprising   \n",
       "fascinating      compelling   enthralling  captivating       unique   \n",
       "good                 decent         great         nice          bad   \n",
       "hilarious             funny    hysterical    priceless      comical   \n",
       "imaginative       inventive    innovative    ingenious    intricate   \n",
       "nasty              sadistic        sleazy         gory         icky   \n",
       "predictable         clichéd     formulaic    contrived  implausible   \n",
       "romantic            romance     screwball  bittersweet  sentimental   \n",
       "senseless         pointless   meaningless   disgusting    sickening   \n",
       "sensitive           sincere    passionate       mature     delicate   \n",
       "superior           inferior        weaker        truer     classier   \n",
       "unfortunate    unacceptable    disastrous      dubious   inadequate   \n",
       "violent              brutal       graphic     gruesome     sadistic   \n",
       "\n",
       "                           4  \n",
       "bland           unconvincing  \n",
       "boring         uninteresting  \n",
       "confused             annoyed  \n",
       "disappointing     satisfying  \n",
       "fascinating            vivid  \n",
       "good                    fine  \n",
       "hilarious           humorous  \n",
       "imaginative         creative  \n",
       "nasty                vicious  \n",
       "predictable             dull  \n",
       "romantic          delightful  \n",
       "senseless             boring  \n",
       "sensitive          confident  \n",
       "superior            maligned  \n",
       "unfortunate        important  \n",
       "violent             violence  "
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "similar_words = {search_term: [item[0] for item in word_vectors.wv.most_similar([search_term], topn=5)]\n",
    "                  for search_term in ['good','superior','violent', 'romantic', 'nasty', 'unfortunate', \n",
    "                                      'predictable', 'hilarious', 'fascinating', 'boring','confused', 'sensitive',\n",
    "                                     'imaginative','senseless', 'bland','disappointing']}\n",
    "pd.DataFrame(similar_words).transpose()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1kAAAHVCAYAAAAD7DG5AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xl4lNX99/H3PUsmyyQkIQgECJEdsgoBwyqLAlZ/KgpF\niAsoYEGF2kqxYtEHxdrKA2qrIogULbigfao/tYILO60QaMISwbCEfQuQkIUsM3M/f0xmCKuoQ8Ly\neV0XVzLn3s7c/+T6cM75HsM0TURERERERCQwLLXdARERERERkSuJQpaIiIiIiEgAKWSJiIiIiIgE\nkEKWiIiIiIhIAClkiYiIiIiIBJBCloiIiIiISAApZImIiIiIiASQQpaIiIiIiEgAKWSJiIiIiIgE\nkK22O/BzxcTEmPHx8bXdDRERERERuUStXbs23zTNejX1vMs+ZMXHx5OZmVnb3RARERERkUuUYRg7\na/J5mi4oIiIiIiISQApZIiIiIiIiAaSQJSIiIiIiEkAKWSIiIiIiIgGkkCUiIiIiIhJAClkiIiIi\nIiIBpJAlIiIiIiISQApZIiIiIiIiAaSQJSIiIiIiEkAKWSIiIiIiIgGkkCUiInIZcDqdAOzbt4+B\nAwee99yXXnqJ0tLSH7xnfHw8+fn5Z7Q/88wzTJ069ad1VEREFLJERERqi9vt/tHXxMbG8uGHH573\nnAsNWSIicnEoZImIiFwEeXl5tGnThoyMDNq2bcvAgQMpLS0lPj6eCRMm0L59exYsWMC2bdvo378/\nHTp0oHv37mzevBmAHTt20LlzZ5KSknjqqadOuW9iYiLgDWmPP/44iYmJJCcn85e//IVXXnmFffv2\n0atXL3r16gXA6NGjSUtLIyEhgaeffvqUfv75z38mKSmJTp06sXXr1jO+x7n6JyIi52ar7Q6IiIhc\nqbZs2cLs2bPp2rUrDzzwAK+99hoAdevWZd26dQD06dOHGTNm0LJlS7799lvGjBnDN998w7hx4xg9\nejT33Xcfr7766lnvP3PmTPLy8sjKysJms3H06FGio6OZNm0aixcvJiYmBoApU6YQHR2N2+2mT58+\nrF+/nuTkZADq1KnDhg0bePvtt/n1r3/Np59+esozRo0addb+iYjIuSlkiYiIXCRNmjSha9euANxz\nzz288sorAAwePBiA4uJiVq1axaBBg/zXlJeXA7By5Uo++ugjAO69914mTJhwxv2/+uorfvWrX2Gz\nef+cR0dHn7UfH3zwATNnzsTlcrF//35ycnL8IWvIkCH+n4899tgp152vfyIicm4KWSIiIoEyfx5M\nngi5uyA+FqO07JTDhmEAEBYWBoDH4yEyMpKsrKyz3s53/s+xY8cOpk6dypo1a4iKimLYsGGUlZ3s\nV/VnnP68H+qfiIicndZkiYiIBML8efD4KLhrJ8wxof9edh05wr//zzPew/Pn061bt1MuiYiI4Npr\nr2XBggUAmKZJdnY2AF27duW9994DYN68eWd95E033cQbb7yBy+UC4OjRowCEh4dTVFQEwPHjxwkL\nC6NOnTocPHiQf/3rX6fc4/333/f/7Ny58wX3T0REzk0hS0REJBAmT4ThpZCAd55IK2gdDa/+36m0\nbduWY8eOMXr06DMumzdvHrNnzyYlJYWEhAQ+/vhjAF5++WVeffVVkpKS2Lt371kfOWLECOLi4khO\nTiYlJYX58+cD3nVU/fv3p1evXqSkpHDdddfRpk0bhg4d6p++6HPs2DGSk5N5+eWXmT59+gX3T0RE\nzs0wTbO2+/CzpKWlmZmZmbXdDRERudpZLd4RrKqJ+HmH4dYXYeN+A9ye2u2biMhVzjCMtaZpptXU\n8zSSJSIiEggt42DLaW3lVe0iInJVUcgSEREJhElTYE4obAJcEH8INtpDve0iInJVUXVBERGRQBia\n4f3pqy7YMg6mTjnZLiIiVw2FLBERkUAZmqFQJSIimi4oIiIiIiISSApZIiIiIiIiAaSQJSIiIiIi\nEkAKWSIiIiIiIgGkkCUiIiIiIhdFXl4eiYmJZ7SPGDGCnJwcAJ5//nl/e0FBAa+99lqN9e/HMgwj\n1TCMX/zQeQpZIiIiIiJSo958803atWsH/PyQZZomHo8noP07j1RAIUtERERERGqPy+UiIyODtm3b\nMnDgQEpLS+nZsyeZmZk88cQTnDhxgtTUVDIyMnjiiSfYtm0bqampjB8/HoAXX3yRjh07kpyczNNP\nPw14R8hat27NfffdR2JiIrt372bYsGEkJiaSlJTE9OnTOXToEB06dPB1I8QwDNMwjDgAwzC2GYYR\nahhGPcMwPjIMY03Vv65Vx8MMw3jLMIzVhmH81zCM2w3DCAImA4MNw8gyDGPwub6z9skSEREREZGL\nZsuWLcyePZuuXbvywAMPnDJS9cILL/DXv/6VrKwswBueNm7c6P+8aNEicnNzWb16NaZpctttt7Fs\n2TLi4uLIzc1l7ty5pKens3btWvbu3cvGjRsB74hYZGQkZWVlHD9+HMAJZALdDcNYARwyTbPUMIw3\ngemmaa6oCmALgbbAROAb0zQfMAwjElgNfAVMAtJM03zkfN9ZI1kiIiIiIhI48+dBm3iwWqBPN5rU\nrUvXrl0BuOeee1ixYsUF32rRokUsWrSI6667jvbt27N582Zyc3MBaNq0Kenp6QA0a9aM7du38+ij\nj/LFF18QEREBQJcuXVi5ciVAOPA80APoDiyvesSNwF8Nw8gCPgEiDMNwAn2BJ6ralwDBQNyF9lsj\nWSIiIiIiEhjz58Hjo2B4KbQGvt2L8YbhbR+aAYBhGBd8O9M0+f3vf89DDz10SnteXh5hYWH+z1FR\nUWRnZ7Nw4UJmzJjBBx98wFtvvUWPHj1Yvnw5QBDwMTABMIHPqi61AOmmaZZVv7/h7eRdpmluOa39\n+gvpt0ayREREREQkMCZP9AasBLzDOa1gl9vk379/HID58+fTrVu3Uy6x2+1UVlYCEB4eTlFRkf9Y\nv379eOuttyguLgZg7969HDp06IzH5ufn4/F4uOuuu3juuedYt24dAN27d+fvf/87QLlpmh7gKN7C\nFb7htEXAo777GIaRWvXrQuDRqrCFYRjXVbUX4R0VOy+FLBERERERCYzcXd4RrGpaN4RXdx2gbdu2\nHDt2jNGjR59yfNSoUSQnJ5ORkUHdqqmFiYmJjB8/nr59+zJ06FA6d+5MUlISAwcOPCWE+ezdu5ee\nPXuSmprKPffcwx//+EcA4uPjMU0TvOEIvOGqwDTNY1WfxwJphmGsNwwjB/hVVfuzgB1YbxjGpqrP\nAIuBdj9U+MKoeuhlKy0tzczMzKztboiIiIiISJt4uGundyTLZxPwUVPYnFc7fQIMw1hrmmZaTT1P\nI1kiIiIiIhIYk6bAnFBvsHLh/Tkn1Nt+FVHhCxERERERCYyq4hZMnuidOtgyDqZOOdl+lVDIEhER\nERGRwBmacdWFqtNpuqCIiIiIiEgAKWSJiIiIiIgEkEKWiIiIiIhIAClkiYiIiIiIBJBCloiIiIiI\nSAApZImIiIiIiASQQpaIiIiIiEgAKWSJiIiIiIgEkEKWiIiIiIhIAClkiYiIiIiIBJBCloiIiIiI\nSAApZImIiIiIiASQQpaIiIiIiEgAKWSJiIiIiIgEkEKWiIiIiIhIAClkiYiIiIiIBJBCloiIiIiI\nSAApZImIiIiIiASQQpaIiIiIiEgAKWSJiIiIiIgEkEKWiIiIiIhIAClkiYiIiIiIBJBCloiIiIiI\nSAApZImIiIiIiASQQpaIiIiIiEgAKWSJiIiIiIgEkEKWiIiIiIhIAClkiYiIiIiIBJBCloiIiIiI\nSAApZImIiIiIiASQQpaIiIiIiEgAKWSJiIiIiIgEkEKWiIhILXnppZcoLS31f/7FL35BQUFBLfZI\nREQCQSFLREQEME0Tj8dTo888PWR9/vnnREZG1mgfREQk8BSyRETkqpWXl0fr1q257777SExM5J13\n3iEpKYnExEQmTJjgP8/pdDJ+/HgSEhK48cYbWb16NT179qRZs2Z88skn/nt1796d9u3b0759e1at\nWgXAkiVL6NmzJwMHDqRNmzZkZGRgmiavvPIK+/bto1evXvTq1QuA+Ph48vPzAXj77bdJTk4mJSWF\ne++9t4bfjIiI/ByGaZq13YefJS0tzczMzKztboiIyGUoLy+PZs2asWrVKuLi4khPT2ft2rVERUXR\nt29fxo4dyx133IFhGHz++efcfPPNDBgwgJKSEj777DNycnK4//77ycrKorS0FIvFQnBwMLm5uQwZ\nMoTMzEyWLFnC7bffzqZNm4iNjaVr1668+OKLdOvWjfj4eDIzM4mJiQHwfz548CADBgxg1apVxMTE\ncPToUaKjo2v5bYmIXL4Mw1hrmmZaTT1PI1kiInJ1mT8P2sSD1QJ9utE0Job09HTWrFlDz549qVev\nHjabjYyMDJYtWwZAUFAQ/fv3ByApKYkbbrgBu91OUlISeXl5AFRWVjJy5EiSkpIYNGgQOTk5/kd2\n6tSJxo0bY7FYSE1N9V9zLt988w2DBg3yhy8FLBGRy4uttjsgIiJSY+bPg8dHwfBSaA18u5ewmYa3\nPcx5zsvsdjuGYQBgsVhwOBz+310uFwDTp0+nfv36ZGdn4/F4CA4O9l/vOx/AarX6rxERkSuTRrJE\nROTqMXmiN2Al4P1vxlZApAmTJ9KpUyeWLl1Kfn4+brebd999lxtuuOGCb11YWEjDhg2xWCy88847\nuN3uH7wmPDycoqKiM9p79+7NggULOHLkCABHjx694H6IiEjtU8gSEZGrR+4u7whWdQ5ve8OGDXnh\nhRfo1asXKSkpdOjQgdtvv/2Cbz1mzBjmzp1LSkoKmzdvJiws7AevGTVqFP379/cXvvBJSEhg4sSJ\n3HDDDaSkpPCb3/zmgvshIiK1LyCFLwzDeAu4FThkmmZiVVs08D4QD+QBvzRN81jVsd8DDwJuYKxp\nmgur2jsAfwNCgM+BceYPdFCFL0RE5IK1iYe7dnpHsnw2AR81hc15tdMnERG56C7Xwhd/A/qf1vYE\n8LVpmi2Br6s+YxhGO+BuvH/i+gOvGYZhrbrmdWAk0LLq3+n3FBER+ekmTYE5od5g5cL7c06ot11E\nRCRAAhKyTNNcBpw+Yfx2YG7V73OBO6q1v2eaZrlpmjuArUAnwzAaAhGmaf6navTq7WrXiIiI/HxD\nM2DqTO/I1XDD+3PqTG+7iIhIgFzM6oL1TdPcX/X7AaB+1e+NgP9UO29PVVtl1e+nt5/BMIxRwCiA\nuLi4AHZZRESueEMzFKpEROSiqpHCF1UjUwHb9dg0zZmmaaaZpplWr169QN1WRERERETkZ7uYIetg\n1RRAqn4eqmrfCzSpdl7jqra9Vb+f3i4iIiIiInLZuJgh6xPg/qrf7wc+rtZ+t2EYDsMwrsVb4GJ1\n1dTC44ZhpBveHR/vq3aNiIiIiIjIZSEga7IMw3gX6AnEGIaxB3gaeAH4wDCMB4GdwC8BTNPcZBjG\nB0AO3tpOD5um6duxcQwnS7j/q+qfiIiIiIjIZSMg+2TVJu2TJSIiIiIi53O57pMlIiIiIiIiKGSJ\niIiIiIgElEKWiIiIiIhIAClkiYiIiIiIBJBCloiIiIiISAApZImIiIiIiASQQpaIiIiIiEgAKWSJ\niIiIiIgEkEKWiIiIiIhIAClkiYiIiIiIBJBCloiIiIiISAApZImIiIiIiASQQpaIiIiIiEgAKWSJ\niIiIiIgEkEKWiIiIiIhIAClkiYiIiIiIBJBCloiIiIiISAApZImIiIiIiASQQpaIiIiIiEgAKWSJ\niIiIiIgEkEKWiIiIiIhIAClkiYiIiIiIBJBCloiIiIiISAApZImIiIiIiASQQpaIiIiIiEgAKWSJ\niIiIiIgEkEKWiIiIiIhIAClkiYiIiIiIBJBCloiIiIiISAApZImIiIiIiASQQpaIiIiIiEgAKWSJ\niIiIiIgEkEKWiIiIiIhIAClkiYiIiIiIBJBCloiIiIiISAApZImIiIiIiASQQpaIiIiIiEgAKWSJ\niIiIiIgEkEKWiIiIiIhIAClkiYiIiIiIBJBCloiIiIiISAApZImIiIiIiASQQpaIiIiIiEgAKWSJ\niIiIiIgEkEKWiIiIiIhIAClkiYiIiIiIBJBCloiIiIiISAApZImIiIiIiASQQpaIiFzxTNPE4/HU\ndjdEROQqoZAlIiJXpLy8PFq3bs19991HYmIi77zzDklJSSQmJjJhwgT/eU6nk/Hjx5OQkMCNN97I\n6tWr6dmzJ82aNeOTTz7x36t79+60b9+e9u3bs2rVKgCWLFlCz549GThwIG3atCEjIwPTNAFYs2YN\nXbp0ISUlhU6dOlFUVITb7Wb8+PF07NiR5ORk3njjjZp/MSIictHZarsDIiIiF0tubi5z584lLi6O\n9PR01q5dS1RUFH379uWf//wnd9xxByUlJfTu3ZsXX3yRAQMG8NRTT/Hll1+Sk5PD/fffz2233cY1\n11zDl19+SXBwMLm5uQwZMoTMzEwA/vvf/7Jp0yZiY2Pp2rUrK1eupFOnTgwePJj333+fjh07cvz4\ncUJCQpg9ezZ16tRhzZo1lJeX07VrV/r27cu1115by29KREQCSSFLRESuWE2bNiU9PZ2PP/6Ynj17\nUq9ePQAyMjJYtmwZd9xxB0FBQfTv3x+ApKQkHA4HdrudpKQk8vLyAKisrOSRRx4hKysLq9XK999/\n739Gp06daNy4MQCpqank5eVRp04dGjZsSMeOHQGIiIgAYNGiRaxfv54PP/wQgMLCQnJzcxWyRESu\nMApZIiJy5Zg/DyZPhNxdEB9LmMv4wUvsdjuG4T3PYrHgcDj8v7tcLgCmT59O/fr1yc7OxuPxEBwc\n7L/edz6A1Wr1X3M2pmnyl7/8hX79+v2kryciIpcHrckSEZErw/x58PgouGsnzDGh/144sBfmz6NT\np04sXbqU/Px83G437777LjfccMMF37qwsJCGDRtisVh45513cLvd5z2/devW7N+/nzVr1gBQVFSE\ny+WiX79+vP7661RWVgLw/fffU1JS8tO/s4iIXJI0kiUiIleGyRNheCkkVH1uBUSaMHkiDYfm8cIL\nL9CrVy9M0+SWW27h9ttvv+Bbjxkzhrvuuou3336b/v37ExYWdt7zg4KCeP/993n00Uc5ceIEISEh\nfPXVV4wYMYK8vDzat2+PaZrUq1ePf/7znz/9O4uIyCXJ8FVBulylpaWZvsXHIiJyFbNavCNY1f/7\n0AUMN8DtLd/+zDPP4HQ6efzxx896i+rHJ02aRI8ePbjxxhvPOG/fvn2MHTvWv7aqury8PFatWsXQ\noUN/9Fd46aWXGDVqFKGhoT/6WhEROTfDMNaapplWU8/TdEEREbkytIyDLae1balq/wkmT558RsDK\nysri888/JzY29qwBC7wha/78+T/pmS+99BKlpaU/6VoREbl0KGSJiMiVYdIUmBMKm/COYG2CvFnB\n1Nt7hIiICEJDQ5k9ezYVFRX8+te/pk6dOoSEhNCgQQO+++47AL799ltefPFFkpOTufbaa/nwww9Z\nunQprVq1IiwsjE6dOjFs2DA2btxIcHAw3bt3JyEhgfDwcJo3b851113H8OHD+fLLL4mLiyM5OZl+\n/foRFRVFw4YN/XtjjR49mrS0NBISEnj66acBeOWVV9i3bx+9evWiV69egLcaYefOnWnfvj2DBg2i\nuLi4ll6uiIj8GApZIiJyZRiaAVNnwkdNYbjBs2/UoWtlMPnFxXTo0IEnn3yS/fv3M2vWLF599VUG\nDRrErl27ME2TDh060LFjR5YuXcpjjz3Gm2++SVFREePHj+eOO+6goKCAL7/8kmuuuQaXy8WgQYOo\nW7cuX375JTfccANhYWFERUXx7rvvUlJSQp8+fZg8eTLFxcX84he/YNy4cQQFBfGPf/yDWbNmMWrU\nKDIzM1m/fj1Lly5l/fr1jB07ltjYWBYvXszixYvJz8/nueee46uvvmLdunWkpaUxbdq02n7LIiJy\nAbQmS0RErjhr1qxh5MiR3Hjjjbz00ktYrVaioqL8U/GKior851qtVqKjo2nevDmrV6/G4XAQHh5O\ncnIyDz30EDNmzODrr7/GZrMRFBREQkICgwcP5vHHH+eee+5h/vz5mKaJaZo0aNCAkJAQCgoKmDp1\nKg8//DCdO3dmz549HDhwgLKyMho0aEC/fv1YsGABFRUVVFZW8tRTT1GnTh2mTZvGunXriImJ4dNP\nP2XYsGH+PbgqKiro3Lkzs2fPrpV3KiJyOavpNVmqLigiIleO+fPg8XGsPHiE2w3Iyc7GAjSKjqbM\nYqG0tNS/J9bw4cP58MMPKSoqoqSkhNWrV+PxeLjjjjs4evQoCxcuZOnSpf5y7Q8++CALFizAMAze\nfvttANavX096ejoul4vVq1dTWVnJkSNHCA4OZteuXbhcLlauXEliYiKRkZG43W4+/PBDkpOT+eCD\nD7j55psZNGgQM2bMwOFwUP0/Pk3T5KabbuLdd9+t8dcoIiI/j0ayRETkyjB/Hjw8HNyVvOSGY+2h\nYXMYPdc7N94RFMSJigr/6RaLBY/HW3UwPDzcX2rdarVSUVFBaWkpQUFBgHcUKTo6GrfbzfHjx4mJ\nieHw4cMkJSWxY8cO/1opm82Gx+PB6XTi8Xj87Xa7HZvNxv/8z/+Qk5PDxo0bcTgcOBwOSkpKCAoK\nwuVyYbFYuO666/j3v//N4cOH6dChA9988w0tWrSgpKSEvXv30qpVq5p9ryIiVwBVFxQREfkpJk+E\noEoIga6/hP/dA3a795AH/AHLZvNO4vAFLB/TNCkqKqK0tJSysjIAHA4HVqsVgIKCAgoLC08Zbdqw\nYcMp93G73aSlpVFSUnJKkQqPx8OJEydYsmQJ3333HXa73T8NsEuXLrz22mvExsby9NNPc/ToUXr1\n6kW9evX429/+xpAhQ0hOTqZz585s3rw5sO9MREQuCoUsERG5MuTugsPAYegYDLcdgcfe9B5qFg7x\nVae5XC7q1q1Lv379/JdWVFTgdruxWq00aNDAv9lwUFAQw4cPxzAM+vXrh8Xi/bN57NgxAJxOJ++9\n957/3Hbt2tG9e3c8Hg8Oh4OoqCgcDgcWi4W0tDTef/99evXqxcCBA3nooYcYOnQoo0aNIjU1FYCR\nI0eyZcsWFi9eDEDv3r1Zs2YN69evZ/369dx2220X9x2KiEhAKGSJiMiVoWUc1APCgQXw+EPQu733\n0K4iKAbS0tKwWq0cP36c//znP/5Lb775ZqxWK06nk4KCAuxVQ2Bt27alSZMmACxfvhyn00lkZCQT\nJ04EvCErPDwcwL8ea9++fZimidvtxuVyUadOHSorKxkwYADgHR175ZVXyMzM5IMPPuB3v/sdM2bM\nqJFXJCIiNUMhS0RErgyTpkCFHSqAh2DUStiw23soNAiOAFtzcmjevDkAAwYM8I9M9erVi3vuuYfe\nvXvjdru56aabsFqt7Nmzhzlz5mCaJv3798dut9OtWzdmzpyJ3W7n6NGjrFq1CsMwsNls1K1bl7i4\nOOrWrUu3bt1wOp0EBQXRvHlzIiIi/F2NiYnh/fffZ8iQITz//PPMmDGD8PDwU6oeiojI5UshS0RE\nrgxDMyBjBJTDKzvhvzshsQk0ioIGUWAFiktLcblcREVF8dlnn+FwOKhbty7Tpk3jn//8J1u2bCEm\nJoaXX34Z0zQpKCjAarViGAa33347rVq1Ys2aNf7S61OmTOGdd97BNE1+/etfA9CyZUtOnDhBmzZt\nCAkJ4dChQ+zfv59u3bqdt/ujRo2if//+/o2IRUTk8qXqgiIicuVoEw/HdtLGBV89Ay4P3DoVZvSE\nPn8HB3DCZiM6OpovvviCLl26ULduXQ4fPkxISAhOp5NDhw7RsmVLPB4PO3fuBLzruFq1aoXH48Ew\nDBISEvj444/ZsmULALfeeisbN270d+Obb75hwoQJlJeXA/Dcc89pPZWISC2q6eqCClkiInLlsFrI\naGby7lZIqAe7iuEPnSH9W+heAmGGwcbt22ndujV2u5369euTn5/PNddcw759+3j22Wf55JNP2Lhx\nIzExMRw7doxrrrkG0zQ5fvw4hmGwZMkSf9BatWoVKSkpp3ShS5curFq1qpZegIiInI1KuIuIiPxU\nLeMYnQ4msNgGj50AVsOcqu2xSoFHH30Uu91OSUkJBw4coLi4mO3bt1NeXk5FRQWFhYUcPXoUj8eD\ny+UiNzeXrVu3UlFRwZ49e+jTpw/PPvssHo+HcePGkZmZicvlAuCTTz75USNWpmn6S8DHx8eTn58f\n2PchIiK1QiNZIiJy5Zg/jxWPPkD3oxXc0wW++C+EloHVhB1Vp1TfhBhO7pvlcrlo2bIlW7duxTRN\nf7XB48ePY7PZqKysBCAhIYHc3FwqKyv950VGRrJ8+XJuvvlmDh8+TElJCZmZmfTo0YM2bdpQUFBA\naWkpDRo0oLKykoqKCtLT01m3bh2ff/45TZs2JT4+nszMTGJiYmr6rYmIXPE0kiUiIvJTzJ/n3ZD4\nqHfY6ugqMMrggAFR9b2nGHhHjwzD8F/WtGlTf5XBnTt3+jcbdrvd/s2HfSNVAJs2baKiogLDMDAM\ng9jYWEJDQ7nzzjvZvXs3FRUVLFy4kAEDBlBWVsb27dvJz8+nXr16/pGzrVu3snDhQsaNG0fTpk39\n9z59g+S8vDwSExMvxtsSEZGLyFbbHRAREfnZ5s+DXz8AIyvYXwC8BuU2sAeB6wQcLvaeZgJUm8Fh\ntVrZtm2b/3NFRcVZb+8LXoZh+H83TRPTNDlw4ACmaRIZGekPZAMGDMDtdmOaJsXFxdjtdnJycvB4\nPFgsFqxWK7/97W+ZOnUqf/7zn+nSpQv79u1j7969XHPNNRfjDYmISA1SyBIRkcvfow+BrYIuz8Nj\nUd6mx+6E3t9AnVLYUwIWAzynzZB3u90XdHtfuKo+xd7hcFBWVuafRhgaGupfU3XixIlTnhEaGkpl\nZaX/Ph6Ph4kTJ/p/j4mJoX79+jRp0oS1a9fywAMPANC3b9+f+kZERKQWabqgiIhc3ubPA3cJjIBV\nc4EbvM10b3MHAAAgAElEQVS3REPIEWhvgPUsAcs440ZevqmD1fmmGAYHB/vbysrKTjmnoKDgrPcL\nCQmhsrKSzp07+4NaUFAQjRs3JjU1lfr16+NwODh06BDdu3dn+PDh/OUvfyE7O/tC34CIiFxiFLJE\nROTyNnki9ATeBuf9wFJv85/egSRgvQkuE4JOu8zk1EDldDqBM9dFRUZGes83TX+wslgs2O32U847\nvZR7SEgI4A1j5eXlrFy50n/M5XKxc+dO1q1bx9GjR1m/fj0ejwe3201BQQE9evQA4N577/1x70JE\nRC4JClkiInJ5+34nrALuAxzQ8BZv89QSyDHBN3HvbKutqgeq4uLis97+bCNUHo/HP03QZ8WKFQD+\n0S7flEHf6FX1qYbVn1tZWUlhYaG/XPyePXto0qQJERERpKSksHXrVt544w0A9u/fT48ePUhNTSUx\nMZHly5fjdrsZNmwYiYmJJCUlMX369HO9KRERqSFakyUiIpe3UAuM9ECC92PjNAj/AAoqzj0l8GLw\nhajTpxFWL5ZxvmuDg4OpqKigcePGVFRUUFRUhM1mo1mzZsyaNYu+ffvyj3/8g379+jFx4kTcbjel\npaVkZWWxd+9eNm7cCJx72qKIiNQcjWSJiMjla/48KPVA66rPlcAEcFdAe6qqCdayswWs6iXkfcrK\nyvB4PBQXF3PgwAHAO61wx44dHDlyhNzcXDp27MicOXN45pln2LBhA+Hh4TRr1ozt27fz6KOP8sUX\nXxAREXHRv5OIiJyfQpaIiFy+Jk+EesAW4I+AB0rvg0oLrDOg7o+4lW9T4tOdLRCdTfWiGNWv9V1v\ns9n85xiGcUaBDd95paWl/mIYoaGhnDhxgh07drBv3z5atGjBsmXLaNSoEcOGDePtt98mKiqK7Oxs\nevbsyYwZMxgxYoT/ntpnS0SkdihkiYjI5St3F9wJzAK2AXb4LhRuuQ4iQsEIufBb+TYcPj1UNWnS\n5IKuP32NFkBiYiIOhwPwlnL3TSX0eDxnFNjwhbyQkBAcDgfl5eX+UbDvv/+e2bNns3btWurXr8/I\nkSMZMWIE69atIz8/H4/Hw1133cVzzz3HunXrLvxLi4jIRaE1WSIicvlqGQfRO+GXwKtQPBe+Pwz/\n3QnhIbAz/8ff8vTpfbt27fpJ1wFs2LDhvMer84W8wsJCKioqMAyDEydO0K5dOwzDYOvWrTz44IMU\nFRXRqlUr9uzZQ6NGjVi0aJG/WIbdbueBBx7wVzrUPlsiIrVDI1kiInL5mjQF5oRCHSAEfvsqDJgO\nYQ5wuSHi9LrtAVZ91Ov0kSkfq9V6yrm+8u++EvChoaEAREVF4XQ68Xg8tGjRgkaNGmG1WnnyySfZ\ntGkTISEhTJ06lRMnTpCZmUnr1q35+uuvycnJYdasWVx//fVkZWXx5ptvap8tEZFappAlIiKXr6EZ\nMHUmvGKFMmiwHg4fg388ApFWCDpHhUFfm91uv6A1V6ev1/Ktp6o+OnX6Givf57CwMLp3747NZsMw\nDH/5d9/0wtLSUgCOHz/uLyOfnZ3Nvn378Hg8fPrpp2RkZFBUVMQf/vAHUlNTyc7OZvXq1XTt2pXU\n1FSGDBnCkiVLSExMZMuWLbRu7a0E0rNnT7Zv305SUhJPPfWUfy8wERG5uBSyRETk8jY0A0rcEAu3\nl8HRUkj/PWzJh2Ig1Dg1aHWrc/JzcHAwTqeT0NBQgoLOHPaKjY0FTk7ls9lsREdHk5iY6A9RTqeT\n4OBg/0hW3brechu5ubls3bqVsrIyIiIiMAwDq9WKYRg0bdqUsLAwwsLCuOuuuwB49NFHWb58OQCf\nffYZbdu2JSkpiYqKCubNm0d4eDjPPvssWVlZ/qIY8+fPJysrC9M0efnll1mxYgUOh4NZs2YB8Kc/\n/Ym6deuyYcMGGjduHMi3LiIi52H80BzxmmYYRn/gZcAKvGma5gvnOz8tLc3MzMyskb6JiMgl6JEx\n8PfX4WGgNYz/HWw9DJ+aEGWDw5XgtEOLBpC123uJBfBN7rNYLOec6neuPa6qt9tsNux2u3/zYZ+N\nGzf6K/ud7Rm+trCwMEpKSggLC/OvxVq0aBG9e/cmODiYkJAQCgsLiYiIoGXLlnTq1InVq1ezevVq\nfvWrX/Haa69ht9u58847yc7OZufOnYSHh/Paa69x77330rx5czZu3Mjx48eJjY0956bLIiJXMsMw\n1pqmmVZjz7uUQpZhGFbge+AmYA+wBhhimmbOua5RyBIRucqF22CsGxJg3zF48n345j+wu9I7YnXp\n/JWD6Ohojh49ekqbzWbzj5Sdjd1up7Ky8pTz6taty5EjR7Db7bRt25YNGzaQkJBAdnY2kyZN4vnn\nnycuLo6DBw8qZImIUPMh61KbLtgJ2Gqa5nbTNCuA94Dba7lPIiJyKSt2+zcj3rAbVn7vDVjgnRJx\nKfEFrOrrt+rVq3dGm0/r1q39wcrhcBAVFUVYWBhRUVGAt6hGdnY2VquV3/zmN1gsFlJTU2nSpAlT\np06ld+/e/OEPfwDgvffeu6jfTURETrrUQlYjYHe1z3uq2k5hGMYowzAyDcPIPHz4cI11TkRELkFO\nq3czYqBfMuROg7Cqv269LrGU5as0WH3qYEFBwRltPnl5ef5piaWlpRQUFFBaWkpRURHww2XhX3rp\nJaZNm0ZycjJbt26lTp06AfkeIiJyfpdayLogpmnONE0zzTTNNN//AIqIyFXq/lHwKrAJcAHToH5V\n9lhdQyHrbKNQY8eOPaPN7Xb7f/dVNTxx4gQWi+WUCoa+Y9WnEZqmSe/evWnWrBnHjx/HMAwMw6B/\n//40adKE3/72t+Tk5NC9e3d/CGvUqBH/+c9/WL9+Pe3btyctrcZmyoiIXNUutTVZnYFnTNPsV/X5\n9wCmaf7xXNdoTZaIiGAzIAgoA0Lgzsbw/76v5S79wFqr052ryIaP1WqlXr16FBcXY7VaKSwsxGKx\nsHnzZpo3b87AgQNZuHAhXbp0wTRNJkyYQHBwMI888gimaRIZGclbb71FixYtAvH1REQuK1d74Qsb\n3sIXfYC9eAtfDDVNc9O5rlHIEhERQgwoB2KBfbAmBtIPn6wgeKnxBSqLxeIftTp9lMs0TaxWK263\nG4fDQXl5OVarFY/Hg81mw+12Y7PZaNu2rf96l8vFihUr6NSpEytXrqRBgwa18v1ERC41V3XhC9M0\nXcAjwELgO+CD8wUsERER4JSARQR0HAkPtT15+Ie3G/55QkNDMQzDP23wXBscn74Xl6+Mu8ViITg4\n2H+Ob08rX/Bq0aIFhmGwc+dO6tevj9VqxWq1EhUVRVZWFllZWdStWxeHw0H37t35wx/+oIAlIlKL\nLqmQBWCa5uemabYyTbO5aZpTars/IiJyGYhxQhoQDDwMK6zw+ncnD1/InA1fUYrT2e12//qnc/Ht\nkeUrXnGuWSKVlZXUqVPHfy+LxYLdbsfj8TBy5Ejsdjs2m42KiopTrsvJ8e5k0rhxYw4cOEB5eTlD\nhgyhWbNmLFiwAIDFixczd+5ccnJyGDZs2AV8YxERuVguuZAlIiLyo700A5ZZvGuyWp96yF7t9+p/\n9E6PTDab7awFLCorK/0jVXByNMowDOx2u//36urXr09ISAghISE0b94cq9XqnwLo8Xj851dUVPiD\n14oVK6hfvz7XXHMN+fn52Gw2/+hWixYteOGFFxg+fDhPPvkkjRo1Yty4ccybN4/Zs2eTkpJCQkIC\nH3/88Y96bSIicnHYfvgUERGRS9zQDO/PUffBFg9YvbUwXKZ3XZYN72iWu9olp481lZeXn/P2JSUl\n/t99o0ymaVJZ6d2Q6/Ty6+Xl5ZimSVlZGdu2bTvlWGlpKU6nk8LCQho0aMDhw4cJDw8nKysLi8VC\nixYt/Gu1ysrKANizZw/PPvss4K0YOGbMGNq3bw/AF1988cPvR0REapRCloiIXBmGZsCqlfDS61Dq\nreYOcCAIGlacDFhhQMk5bgEQGxvLvn37sFqtXHPNNezfvx/AX3TCNxXQV5TC9xOgYcOG7N+/n4KC\nAkJCQnA4HDRs2JATJ05w8OBBQkJCME3TP73Qt0dWaGgoFosF0zQ5dOgQMTExhIeHEx0dzZYtWxg4\ncCC//OUvufHGGwP80kRE5GLQdEEREbky9L0R/v46/Bp4slq7DRqGnfxYetplp08RzM/P97dX3/C+\n+jQ/OFmUovr6K9/0PoA+ffpQWVlJXl4eBw8exDAMysvLGTBggH80zBfaunTpwm233ebtX2kpR44c\nITc3l2+//ZaCggKWLVuG0+lk06ZNOJ1OJk6cSEpKCunp6Rw8eBCAbdu2kZ6eTlJSEk899RROp/NH\nvT4REQkchSwREbn8PTIGVn4NDwMJQLUaFl9b4dpqQ1cmYD1tQVb1oOULJ76pgD6vv/66f1pg9SIZ\nrVufXAR27Ngx4uPjMQyDzz//nHr16p1SNMNqtfL1118D3nVcUVFROBwO5syZQ1ZWlr9su8fjoXHj\nxjidTkzT5Pvvv+e2225j1apVlJSUsG3bNqxWK9u2beP5558HYPTo0ZSUlODxeFi8eDGlpaX+wCgi\nIjVLIUtERC5/c2fCCbxFL1YBr588NKIIlp12utXiLXxh4B1Nqr6mymbzzqQ/fYSrSZMm/rLo1fe0\nioiI8P9eUFDAsWPHcDgceDweCgsLiY6OpmHDhpimidPppKKiAovFwpAhQ3A4HJw4cQKr1UrLli0x\nTZPhw4cTHR1NQUGBv1S7aZr86le/YuTIkQB06dKFdevWcdttt/nXZC1btozBgwezadMmfvOb35x3\nY2MREbm4FLJEROTyV+z27pP1D+ADoD/Yqv7CFZ/l9Aq3d0TLUW16n69aoG+KoMfjISQkxH/87rvv\n5sCBAwDceeed/vZvv/32lHsXFhbicnlXhJWXlxMSEkJ0dDTgHekqKCjA4/GwcOFCf2ELt9vNvn37\nAFiwYAHHjx+nuLiY6OhomjZtCsDMmTPp1asXAA6Hg86dO/Ovf/2LXbt2UVxcTEVFBcXF3m970003\n/bj3JyIiAaWQJSIilz+n1btP1iJgJHS7Gb7/v94Rq3sSvH/sDKBr1en169fHbrfTrl07rFYrcXFx\nmKZJWFgYzz77LIZhMHz4cH8FP4vFQtu23t2N7XY769evB7yFLtq0aePvxjPPPMMtt9xCQkKC/znP\nPvusf+rhQw89xJNPPonFYuGxxx5j8ODB/k2Fd+zYQXh4OHFxcdx5551YrVZcLhcvvvgiFouFUaNG\nsXjxYgBmzZrFV199xbhx47DZbEybNg273c7mzZsBeO+99y7q6xYRkfMzLvfpBGlpaWZmZmZtd0NE\nRGrTI2O8RS+OA38DbFDpgsiRUFq1r6/VgCDTO6vQJzw8nKKiIn+FQN9eVj6RkZH+CoDVhYWFnVLW\n3cdisWCz2XC73f77RUVF0ahRIzZs2ECdOnUoKyvzl4t3Op24XC4qKir8UxZ9VQZ9/bBYLHg8HiZM\nmMChQ4eYM2cO4A17vn23hg0bxurVq9m9ezdxcXE0btyYf/3rXyQnJxMREcGsWbNOCYMiIlcbwzDW\nmqaZVlPP00iWiIhc/v76mjdghQJbvE12G/xx8MlT3KcFLICioiIAxo8fD5xaKdBisfgDlm+dlk9p\naSkOh8N/no9pmrhcLn9gMk0Ti8XCrl27/M/zBawmTZoQGRlJWVmZf60XeKcC2mw2DMPA6XQyd+5c\nAF599VUyMzMxDINWrVoRHx/P7373OyIjI5k9ezZ9+vQhJiYGj8fDv//9b4KCgli9ejVTp05lzJgx\nP/KFiojIz6F9skRE5MrQqim02QmzgJFAaxjbBMZVO8XgzE2IAV544YUz2qoXw3C5XKfsh2Wapj8s\n+c7zjYKdPkPkyJEjZy1CsWfPHn+7bz0WeNdx+e5ZXFzMvffeC0BUVBTHjh0DIDc3lwYNGhAWFkZh\nYSFt27bF7XZTUlJCcHAwhYWF2O12rr/+ev89RUSk5mgkS0RErgyTpsDqUOgCzAWGAdO9h8K8g06Y\ngL3ayNPpFQSrO330yhewfCXeq++ZFRkZSffu3c96z+oBy3dtbGwsycnJ/va7774bOLnhsU+bNm1w\nOp0YhsHu3bs5cuQIhmHw1FNPER0dzQsvvIBpmvzpT3/C4XBQVlaGYRhYrVZWrFhBVlYWWVlZfPfd\nd+f8niIiEngKWSIicmUYmgFTZ3qLX+wDHMBj3kPBdu9PiwEh1UKM1WrFYrFgsVhOqSRos9n8FQGr\nMwzDXxGwTp06hIV5dzl2uVysXLkSwN8GEBQU5C+CAfir/+3fv5+cnBxvnywWOnbs6L9/bGysP6jt\n2rULu92OzWajS5cuDB06FMMwCAkJ4ZZbbsFqteJ0Opk0aRL79++nY8eObNiwgY4dO5KXlwd4Q152\ndvZPeKEiIvJTqfCFiIhcWQwD6gH5wN/AuB9evhfGvVO1CbEJvl2u7HY7lZWVREdHc/To0R/1GF9B\nijMff7J4hs1m85dzrz7d8HSnH/Otx/KtGbNarbRr146IiAhWrVpFdHQ0xcXFREVFsXz5clq0aMEz\nzzyD0+nk8ccfZ8eOHYwePZr9+/dTWVnJ3XffzaRJk37U9xMRuZKo8IWIiMjPEYJ3TZYD2OKdKji2\nv/dQ/+aQXnVaeno6K1asACA0NJRu3bp5Lw8JwWq1UqdOHcC7Fso3zc8nKCgI0zT9xS8Ahg0bBkCf\nPn2wWq3AybVchmHgcDgYOHCg/3qf6OhomjVrhtPpxG63+9tPnDhBeno6K1eupFOnTmzevJn//ve/\nPPHEE+Tn57Nu3TqcTqd/M+SxY8cyaNAgAK699lq++OILsrOzycnJUcASEalhClkiInJlKQNaA5XA\nq4AHcFUdy4NUvCNYDocDi8VCaGgo8fHxUNUeGRnJiBEj/IHH4/Fgt9vp0KEDkZGRBAUF+fe9io2N\nxW63ExYWxpw5c7BYLBw+fNg/wmW324mJicFqtVJZWcnSpUsB7/ouX9AqLi6mrKyMunXrYrVaiYiI\n4E9/+hMul4vc3FwefPBBli1bRt++falfvz7PP/88AO3ateO5556jb9++JCcnc9NNN7F///6L/XZF\nROQCKGSJiMiVpVVTbxl3O9ACioOA+72HPk2BFjbv6NSSJUtIS0ujefPmtG7dmkWLFuHxeOhQvz43\n/u9H9M3Pxwr8degQnE4nVquVkpIS3nvvPaZOnUpiYiKNGzcmPDzcv34rNjaWtm3b0q5dOxo1akRk\nZCQtW7akQYMGPPDAA/zv//4v9evXxzAMFixYQEREBDfccIO/WuDgwYPp1q0bgwYNon379ixbtozC\nwkKKi4v59NNP2b59+ylfdfDgwWRlZbF+/XrWrl1Leno6IiJS+xSyRETkyjJpCswJhXJgF94a7nOr\nju3i5KjWaUJCQmgcFcmSrCx+V5qPpYt3edc9/3yb6QMGcPDgQSorK3n00UeZNGkSGzZsICsriz59\n+uB0OlmxYgWVlZXs3r0bOFnkok6dOvTp04f58+fz4IMP8sQTT9C8eXNmzJjByJEjWb58OZ07d/Zv\nFmyaJvfccw+7du2iR48ejB07lsjISH/5dhERufQpZImIyJXFV2UwGO/arATAVlXGfSSkBp+s5gfQ\no0cP/3qsRww3sdHQtCEUnPBuYJzqLuWFmTP48MMPiYuLAyAlJYUbb7yRsLAwtmzZQnh4OA8//DDh\n4eHk5OSwbds2HnnkEX+VwGnTphESEsK2bduYNm0aSUlJxMbG8sUXX2CxWNi6dSspKSkMGzYMi8XC\nihUr2LFjB7fccgt///vfSUlJYfHixTX7HkVE5CdTdUEREbkyWQz4G1B9uysX3v2zPGf/2zfdYjC3\nCVS44Lp4mDUCQq3AcAPcZ1YSFBGRy4OqC4qIiASCb21WdVuq2s/hsVZN2bofcl6EF4fCfa9XXdMy\njiFDhpCcnMz06dPPef0zzzzD1KlTA9F7ERG5jClkiYjIlcm3NmsT3hGsTXg/T5py/muqzo0Nhw9v\n8l5zYOx41qxZw/r163nsscdqpPsiInL5UsgSEZErk29t1kdNvdP9Pmrq/Tw04/zXBDngo6bkDYPE\nqXaYOpO+M95g7969pKamsnz5crZt20b//v3p0KED3bt3Z/PmzWfc6lznLFiwgMTERFJSUujRowcA\nmzZtolOnTqSmppKcnExubu7FeCMiIlJDbD98ioiIyGVqaMb5Q9XZ2GywOQ/y8uDWW2FoBp906cqt\nt95KVlYW4N1weMaMGbRs2ZJvv/2WMWPG8M0335xym1GjRp31nMmTJ7Nw4UIaNWpEQUEBADNmzGDc\nuHFkZGRQUVGB2+0OwJcXEZHaopAlIiIyfx5Mngi5u8Cs+tyl61lPLS4uZtWqVQwaNMjfVl5efsHn\ndO3alWHDhvHLX/6SO++8E4DOnTszZcoU9uzZw5133knLli0D/AVFRKQmKWSJiMjVbf48eHwUDC+F\n1sAIvJ8nnH3tlsfjITIy0j+q9WPPmTFjBt9++y2fffYZHTp0YO3atQwdOpTrr7+ezz77jF/84he8\n8cYb9O7dO0BfUEREaprWZImIyNVt8kRvwKraTwsL3s+vnL1KYEREBNdeey0LFiwAvJsHZ2dnX/A5\n27Zt4/rrr2fy5MnUq1eP3bt3s337dpo1a8bYsWO5/fbbWb9+/cX6tiIiUgMUskRE5OqWu8s7glVd\na2DH3nNeMm/ePGbPnk1KSgoJCQl8/PHHF3zO+PHjSUpKIjExkS5dupCSksIHH3xAYmIiqampbNy4\nkfvuuy+AX1BERGqaNiMWEZGrW5t4uGundyTLZxPeaoSb82qnTyIiElDajFhERKQm/ZT9tERERM5D\nhS9EROTq5ivx7qsu2DIOpk758aXfRUREqihkiYiI/JT9tERERM5B0wVFREREREQCSCFLREREREQk\ngBSyREREREREAkghS0REREREJIAUskRERERERAJIIUtE5P+3d+/RXpV1/sDfjzI5hnlBrUHLoDWW\nxOWoHFFSKiWD38qYGdMf3jKyGUcqVzHZkD9cXkjXaoqlaWOZsyh0BhKji85M9kNGmVilKDCQ4CWZ\nn2QoYzpaQjQp+Pz+OF/wgHhly5cDr9da33X299n72ftzvutxH9/svZ8vAECDhCwAAIAGCVkAAAAN\nErIAAAAaJGQBAAA0SMgCAABokJAFAADQICELAACgQUIWAABAg4QsAACABglZAAAADRKyAAAAGiRk\nAQAANEjIAgAAaJCQBQAA0CAhCwAAoEFCFgAAQIOELAAAgAYJWQAAAA0SsgAAABokZAEAADRIyAIA\nAGiQkAUAANAgIQsAAKBBQhYAAECDhCwAAIAGCVkAAAANErIAAAAaJGQBAAA0SMgCAABokJAFAADQ\nICELAACgQUIWAABAg4QsAACABglZAAAADRKyAAAAGiRkAQAANEjIAgAAaJCQBQAA0CAhCwAAoEFC\nFgAAQIOELAAAgAYJWQAAAA0SsgAAABokZAEAADRIyAIAAGiQkAUAANAgIQsAAKBBWxWySiknl1KW\nlVKeK6V0brbu/FLK8lLKA6WUUd3ah5ZS7mmtu6qUUlrtu5VSZrba55dS+m1NbQAAAO2wtVeyliY5\nMclPujeWUt6d5JQkA5OMTvL1UsqurdXfSPJXSQ5uvUa32j+R5Kla658muSLJ321lbQAAANvcVoWs\nWut9tdYHtrDqz5LcUGv9Q631oSTLkwwrpfRNsmet9c5aa01yfZI/79bnutbyrCQjN1zlAgAA6Cle\nr2eyDkzyq27vV7baDmwtb96+SZ9a67okv02y75Z2Xko5u5SyoJSy4PHHH2+4dAAAgNeu18ttUEqZ\nk+RPtrBqUq31puZLenm11muTXJsknZ2dtR01AAAAbMnLhqxa6wdew34fSfK2bu/f2mp7pLW8eXv3\nPitLKb2S7JXkv1/DsQEAANrm9bpd8OYkp7RmDOyfrgku7qq1rkrydCnlqNbzVmcmualbn4+1lk9K\nclvruS0AAIAe42WvZL2UUspfJPlakv2T/GspZXGtdVStdVkp5cYk9yZZl+RTtdb1rW6fTDItye5J\nbmm9kmRqkn8spSxP8mS6ZicEAADoUUpPv1jU2dlZFyxY0O4yAACA7VQpZWGttfPlt2zG63W7IAAA\nwE5JyAIAAGiQkAUAANAgIQsAAKBBQhYAAECDhCwAAIAGCVkAAAANErIAAAAaJGQBAAA0SMgCAABo\nkJAFAADQICELAACgQUIWAABAg4QsAACABglZAAAADRKyAAAAGiRkAQAANEjIAgAAaJCQBQAA0CAh\nCwAAoEFCFgAAQIOELAAAgAYJWQAAAA0SsgAAABokZAEAADRIyAIAAGiQkAUAANAgIQsAAKBBQhYA\nAECDhCwAAIAGCVkAAAANErIAAAAaJGQBAAA0SMgCAABokJAFAADQICELAACgQUIWAABAg4QsAACA\nBglZAAAADRKyAAAAGiRkAQAANEjIAgAAaJCQBQAA0CAhCwAAoEFCFgAAQIOErO3Q4sWL86Mf/Wjj\n+5tvvjlf+tKXXtdjzp07Nz/72c9edrtp06bl05/+9OtaCwAA9GRC1nZo85A1ZsyYfOELX3hdj/lK\nQxYAAPDShKyG/e53v8uHPvShdHR0ZNCgQZk5c2YWLlyY973vfRk6dGhGjRqVVatWJUne//73Z+LE\niRk2bFje+c53Zt68eXnmmWdy4YUXZubMmTn00EMzc+bMTa4ejRs3LuPHj89RRx2Vd7zjHZk7d27O\nOuusDBgwIOPGjdtYx+zZszN8+PAcfvjhOfnkk7NmzZokSb9+/XLRRRfl8MMPz+DBg3P//fdnxYoV\nueaaa3LFFVfk0EMPzbx58/LP//zPOfLII3PYYYflAx/4QB577LFt/lkCAEBPJGQ17Mc//nEOOOCA\nLFmyJEuXLs3o0aNz7rnnZtasWVm4cGHOOuusTJo0aeP269aty1133ZWvfvWrueSSS/KGN7whkydP\nzjol/o8AABM8SURBVNixY7N48eKMHTv2Bcd46qmncscdd+SKK67ImDFjMmHChCxbtiz33HNPFi9e\nnCeeeCKXXnpp5syZk0WLFqWzszOXX375xv777bdfFi1alPHjx2fKlCnp169fzjnnnEyYMCGLFy/O\niBEjcswxx+TOO+/Mf/zHf+SUU07Jl7/85W3y+QEAQE/Xq90F7GgGDx6cz33uc5k4cWJOOOGE7LPP\nPlm6dGmOP/74JMn69evTt2/fjdufeOKJSZKhQ4dmxYoVr+gYH/7wh1NKyeDBg/OWt7wlgwcPTpIM\nHDgwK1asyMqVK3Pvvffm6KOPTpI888wzGT58+BaP+f3vf3+Lx1i5cmXGjh2bVatW5Zlnnkn//v1f\n3QcBAAA7KSGrKTOmJ5Mn5Z0PPpxF7zgwP1r9dC644IIcd9xxGThwYO64444tdtttt92SJLvuumvW\nrVv3ig61oc8uu+yycXnD+3Xr1mXXXXfN8ccfn+985zuv+Zjnnntu/uZv/iZjxozJ3Llzc/HFF7+i\n2gAAYGfndsEmzJienHd28pFf5tHLa9544sqc8cPr8/kjjsj8+fPz+OOPbwxZzz77bJYtW/aSu3vT\nm96U1atXv+ZyjjrqqPz0pz/N8uXLk3Q9J/aLX/ziVR3zt7/9bQ488MAkyXXXXfeaawEAgJ2NkNWE\nyZOSj69NBib3rEqGfSc5dP3aXHL11zJ58uTMmjUrEydOTEdHRw499NCXncXv2GOPzb333rtx4otX\na//998+0adNy6qmnZsiQIRk+fHjuv//+l+zz4Q9/OD/4wQ82Tnxx8cUX5+STT87QoUOz3377veoa\nAABgZ1Vqre2uYat0dnbWBQsWtLeIXXdJvl03vflyXZKPl2T9c+2qCgAASFJKWVhr7dxWx3MlqwkH\nH5Q8sFnbA612AABgpyJkNeHCy5JvvzFZlq4rWMvS9f7Cy9pcGAAAsK2ZXbAJp53e9XPypOTBh7uu\nYE257Pl2AABgpyFkNeW004UqAADA7YIAAABNErIAAAAaJGQBAAA0SMgCAABokJAFAADQICELAACg\nQUIWAABAg4QsAACABglZAAAADRKyAAAAGiRkAQAANEjIAgAAaJCQBQAA0CAhCwAAoEFCFgA7tT32\n2ONVbX/xxRdnypQpSZJx48Zl1qxZr0dZAPRgQhYAPdq6devaXQIAbELIAmC78bvf/S4f+tCH0tHR\nkUGDBmXmzJm5++678573vCcdHR0ZNmxYVq9enWnTpmXMmDE57rjjMnLkyCTJV77ylRxxxBEZMmRI\nLrrooo1tV111VZJkwoQJOe6445Ikt912W04//fSNx50wYUIGDhyYkSNH5vHHH0+S/MM//EOOOOKI\ndHR05CMf+UjWrl27LT8KAHowIQuA7caPf/zjHHDAAVmyZEmWLl2a0aNHZ+zYsbnyyiuzZMmSzJkz\nJ7vvvnuSZNGiRZk1a1b+/d//PbNnz86DDz6Yu+66K4sXL87ChQvzk5/8JCNGjMi8efOSJAsWLMia\nNWvy7LPPZt68eXnve9+bpCvYdXZ2ZtmyZXnf+96XSy65JEly4okn5u67786SJUsyYMCATJ06tT0f\nCgA9Tq92FwDATm7G9GTypOTBhzP47X3zudXPZGKfPjnhhBOy9957p2/fvjniiCOSJHvuuefGbscf\nf3z69OmTJJk9e3Zmz56dww47LEmyZs2aPPjggznzzDOzcOHCPP3009ltt91y+OGHZ8GCBZk3b97G\nK1y77LJLxo4dmyQ544wzcuKJJyZJli5dmgsuuCC/+c1vsmbNmowaNWqbfSQA9GxCFgDtM2N6ct7Z\nycfXJu9K3vnAo1k0dff8aPXTueCCCzbe3rclvXv33rhca83555+fv/7rv37Bdv3798+0adPynve8\nJ0OGDMntt9+e5cuXZ8CAAVvcbyklSdekFj/84Q/T0dGRadOmZe7cuVv3uwKw03C7IADtM3lSV8Aa\nmKRX8ugByRs/9vuccdst+fznP5/58+dn1apVufvuu5Mkq1ev3uJEF6NGjcq3vvWtrFmzJknyyCOP\n5Ne//nWSZMSIEZkyZUre+973ZsSIEbnmmmty2GGHbQxTzz333MYZAmfMmJFjjjlm47H69u2bZ599\nNtOnT3+9PwkAdiCuZAHQPg8+nLzr+bf3/Cr5/Ixkl5W/zB9dckm+8Y1vpNaac889N7///e+z++67\nZ86cOS/YzQc/+MHcd999GT58eJKuadn/6Z/+KW9+85szYsSIXHbZZRk+fHh69+6dP/7jP86IESM2\n9u3du3fuuuuuXHrppXnzm9+cmTNnJkm++MUv5sgjj8z++++fI488MqtXr359PwsAdhil1truGrZK\n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\n969oZ2UA7CBKKQtrrZ3b6niuZAHQXhdelnz7jcmyJOuS/CLJb0pXOwD0QCa+AKC9WpNbbJhdsN/B\nB2XpdZc93w4APYyQBUD7nXa6UAXADsPtggAAAA0SsgAAABokZAEAADRIyAIAAGiQkAUAANAgIQsA\nAKBBQhYAAECDhCwAAIAGCVkAAAANErIAAAAaJGQBAAA0SMgCAABokJAFAADQICELAACgQUIWAABA\ng0qttd01bJVSyuNJftnuOnqA/ZI80e4i2GkZf7ST8Ue7GHu0k/G3qbfXWvffVgfr8SGLV6aUsqDW\n2tnuOtg5GX+0k/FHuxh7tJPx115uFwQAAGiQkAUAANAgIWvncW27C2CnZvzRTsYf7WLs0U7GXxt5\nJgsAAKBBrmQBAAA0SMgCAABokJDVQ5VSvlJKub+U8vNSyg9KKXt3W3d+KWV5KeWBUsqobu1DSyn3\ntNZdVUoprfbdSikzW+3zSyn9uvX5WCnlwdbrY9vyd2T7VUo5uZSyrJTyXCmlc7N1xh/bhVLK6NY4\nXF5K+UK766FnKqV8q5Ty61LK0m5tfUopt7bOTbeWUvbptq6xcyCUUt5WSrm9lHJv6+/uZ1rtxuB2\nTsjquW5NMqjWOiTJL5KcnySllHcnOSXJwCSjk3y9lLJrq883kvxVkoNbr9Gt9k8kearW+qdJrkjy\nd6199UlyUZIjkwxLclH3/4jZqS1NcmKSn3RvNP7YXrTG3dVJ/leSdyc5tTU+4dWalufPVxt8Icm/\n1VoPTvJvrfeNngOhZV2Sz9Va353kqCSfao0zY3A7J2T1ULXW2bXWda23dyZ5a2v5z5LcUGv9Q631\noSTLkwwrpfRNsmet9c7aNdvJ9Un+vFuf61rLs5KMbP3rxqgkt9Zan6y1PpWuYLf5Hxp2QrXW+2qt\nD2xhlfHH9mJYkuW11v9Xa30myQ3pGmvwqtRaf5Lkyc2au5+3rsum57OmzoGQWuuqWuui1vLqJPcl\nOTDG4HZPyNoxnJXkltbygUl+1W3dylbbga3lzds36dMKbr9Nsu9L7AtejPHH9sL44fX0llrrqtby\nfyV5S2u5yXMgbKJ1G99hSebHGNzu9Wp3Aby4UsqcJH+yhVWTaq03tbaZlK5LydO3ZW3s+F7J+APY\n2dVaaynF9+Hwuiql7JHke0k+W2t9uvuFJmNw+yRkbcdqrR94qfWllHFJTkgysj7/hWePJHlbt83e\n2mp7JM/fUti9vXuflaWUXkn2SvLfrfb3b9Zn7qv/TeiJXm78vQjjj+3Fi41FaMJjpZS+tdZVrduw\nft1qb/IcCEmSUsofpStgTa+1fr/VbAxu59wu2EOVUkYn+dskY2qta7utujnJKa2ZYvqn68HGu1qX\nlJ8upRzVus/2zCQ3deuzYea2k5Lc1gpt/zfJB0sp+7QmHPhgqw1ejPHH9uLuJAeXUvqXUt6QrgfB\nb25zTew4up+3PpZNz2dNnQMhrfEyNcl9tdbLu60yBrdzrmT1XH+fZLckt7YuGd9Zaz2n1rqslHJj\nknvTdRvhp2qt61t9PpmuWZJ2T9czXBue45qa5B9LKcvT9XDvKUlSa32ylPLFdP3PSpJMrrVu/vAv\nO6FSyl8k+VqS/ZP8ayllca11lPHH9qLWuq6U8ul0BfNdk3yr1rqszWXRA5VSvpOuq+r7lVJWpmvW\n0y8lubGU8okkv0zyv5OkyXMgtByd5KNJ7imlLG61/Z8Yg9u9IqgCAAA0x+2CAAAADRKyAAAAGiRk\nAQAANEjIAgAAaJCQBQAA0CAhCwAAoEFCFgAAQIP+P6Atz9XInBiqAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x2c4814a5c18>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.manifold import TSNE\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "pd.options.display.max_colwidth = 200\n",
    "%matplotlib inline\n",
    "words = sum([[k] + v for k, v in similar_words.items()], [])\n",
    "wvs = w2v_model.wv[words]\n",
    "\n",
    "tsne = TSNE(n_components=2, random_state=0, n_iter=10000, perplexity=2)\n",
    "np.set_printoptions(suppress=True)\n",
    "T = tsne.fit_transform(wvs)\n",
    "labels = words\n",
    "\n",
    "plt.figure(figsize=(14, 8))\n",
    "plt.scatter(T[:, 0], T[:, 1], c='orange', edgecolors='r')\n",
    "for label, x, y in zip(labels, T[:, 0], T[:, 1]):\n",
    "    plt.annotate(label, xy=(x+1, y+1), xytext=(0, 0), textcoords='offset points')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
